package com.mastercard.assets.web.util.to;

import java.util.ArrayList;
import java.util.List;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.jpa.TblCuenta;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.jpa.TblTipoCuenta;
import com.mastercard.assets.jpa.TblTipoCuentaPaquete;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;

public class ManejadorPaquetesSolicitar
{
	private int cveTipoCuenta ;

	private TblTipoCuenta countType ;
	
	private TblCuenta count ;
	private int cveCuenta ;
	
	private List< PaqueteSolicitar > paqueteSolicitarLista = new ArrayList< PaqueteSolicitar >( ) ;
	
	public int getCveCuenta() {
		return cveCuenta;
	}

	public void setCveCuenta(int cveCuenta) {
		this.cveCuenta = cveCuenta;
	}

	public TblCuenta getCount() {
		return count;
	}

	public void setCount(TblCuenta count) {
		this.count = count;
	}

	public TblTipoCuenta getCountType() {
		return countType;
	}

	public int getCveTipoCuenta() {
		return cveTipoCuenta;
	}

	public void setCveTipoCuenta(int cveTipoCuenta) {
		this.cveTipoCuenta = cveTipoCuenta;
	}

	public void initialize( )
		throws
			MasterCardException
	{
		// en caso de 0 o menos
		if( cveTipoCuenta < 1 )
		{
			throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.NoCountTypeOnInitialize" ) , 
						MCUtil.MASTERCARD_ERROR_CODE_COUNTTYPE_PACKAGEREQUEST_COUNTTYPE_NOT_EXITS , 
						null ) ;
		}
		
		// trae el tipo de cuenta
		countType = MasterCardDAO.findCountTypeById( cveTipoCuenta ) ;
//		MasterCardDAO.closeEntityManager( ) ;
		// en caso de null
		if( countType == null || countType.getStatus( ) != 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.CountTypeIdNotExist" , cveTipoCuenta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_COUNTTYPE_PACKAGEREQUEST_COUNTTYPE_ID_NOT_EXITS , 
					null ) ;
		
//		System.out.println( "Numero de cuenta: " + cveCuenta ) ;
//		
		// en caso de 0 o menos
		if( cveCuenta > 0 )
		{
			// trae el tipo de cuenta
			count = MasterCardDAO.findCountById( cveCuenta ) ;
//                        MasterCardDAO.closeEntityManager( ) ;
//			System.out.println( "Nombre de cuenta: " + count.getNombre( ) ) ;
//			
		}
                
                if( count.getStatus( ) != 1 )
		{
			throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.NoCountTypeOnInitialize" ) , 
						MCUtil.MASTERCARD_ERROR_CODE_COUNTTYPE_PACKAGEREQUEST_COUNTTYPE_NOT_EXITS , 
						null ) ;
		}
		
		// toma todos los tipocuentapaquete
		List< TblTipoCuentaPaquete > tipoCuentaPaquetes = countType.getTblTipoCuentaPaquetes( ) ;
		
		// Recorre los tipocuentapaquetes
		for( TblTipoCuentaPaquete tipoCuentaPaq : tipoCuentaPaquetes )
		{
			if ( tipoCuentaPaq.getStatus( ) == 0 )
                            continue ;
                        // verifica el paquete
			TblPaquete paq = tipoCuentaPaq.getTblPaquete( ) ;
			
			// en caso de que el paq sea status 0
			if( paq.getStatus( ) == 0 )
				continue ;
			
			// paquetesolicitar al que introducira el paquete
			PaqueteSolicitar paqSolInt = null ;
			
			// recorre los PaqeteSolicitar
			for( PaqueteSolicitar paqSol : paqueteSolicitarLista )
			{
				// para cada paquete verifica si es del mismo paqueteSolicitar
				// en caso d euqe sea del mismo
				if( paqSol.verifyPackage( tipoCuentaPaq ) )
				{
					// asitna paqueteSolicitar
					paqSolInt = paqSol ;
					
					// rompe ciclo
					break ;
				}
			}
			
			// en caso de que paqSolInt sea null
			if( paqSolInt == null )
			{
				paqSolInt = new PaqueteSolicitar( paq.getHabitacion( ) , paq.getTblAsset( ) , cveCuenta ) ;
				// agrega al arreglo
				paqueteSolicitarLista.add( paqSolInt ) ;
			}
			
			// agrega el tipoCuentaPaquete
			paqSolInt.addPackageCountType( tipoCuentaPaq ) ;
			
			// ya quedo por cada paqueteTipoCuenta.
		}// termina el ciclo for
		
	}// termina el metodo de inicializacion
	
	public int getQuantityOfPackage( )
	{
		// en caso de null
		if( this.paqueteSolicitarLista == null || this.paqueteSolicitarLista.size( ) == 0 )
			return 0 ;
		
		// resultado
		int res = 0 ;
		
		// recorre
		for( PaqueteSolicitar paq : paqueteSolicitarLista )
		{
			res += paq.getCantidadAsignada( ) ;
		}
		
		return res ;
	}
	
	public int getPackageToAsign( )
	{
		// en caso de null
		if( this.paqueteSolicitarLista == null || this.paqueteSolicitarLista.size( ) == 0 )
			return 0 ;
		
		// resultado
		int res = 0 ;
		
		// recorre
		for( PaqueteSolicitar paq : paqueteSolicitarLista )
		{
			res += paq.getCantidadDisponible( ) ;
		}
		
		return res ;
	}
	
	public int getPackageAsigned( )
	{
		// en caso de null
		if( this.paqueteSolicitarLista == null || this.paqueteSolicitarLista.size( ) == 0 )
			return 0 ;
		
		return getQuantityOfPackage( ) - getPackageToAsign( ) ;
	}

	public List<PaqueteSolicitar> getPaqueteSolicitarLista() {
		return paqueteSolicitarLista;
	}
	
	public int getCountPackageAsigned( )
	{
		// en caso de null
		if( count == null )
			return 0 ;
		
		// resultado
		int res = 0 ;
		
		// recorre los paquetes
		for( PaqueteSolicitar paq : paqueteSolicitarLista )
		{
			// en cada uno solicita el dato y lo agrega
			res += paq.getPackageFromCount( ) ;
		}
		
		return res ;
	}
        
        //Inicializa para BDM titular (sin cuenta)
        public void initializeBDMTitular( )
		throws
			MasterCardException
	{
		// en caso de 0 o menos
		if( cveTipoCuenta < 1 )
		{
			throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.NoCountTypeOnInitialize" ) , 
						MCUtil.MASTERCARD_ERROR_CODE_COUNTTYPE_PACKAGEREQUEST_COUNTTYPE_NOT_EXITS , 
						null ) ;
		}
		
		// trae el tipo de cuenta
		countType = MasterCardDAO.findCountTypeById( cveTipoCuenta ) ;
//		MasterCardDAO.closeEntityManager( ) ;
		// en caso de null
		if( countType == null || countType.getStatus( ) != 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.CountTypeIdNotExist" , cveTipoCuenta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_COUNTTYPE_PACKAGEREQUEST_COUNTTYPE_ID_NOT_EXITS , 
					null ) ;
		
//		System.out.println( "Numero de cuenta: " + cveCuenta ) ;
//		
		// en caso de 0 o menos
//		if( cveCuenta > 0 )
//		{
//			// trae el tipo de cuenta
//			count = MasterCardDAO.findCountById( cveCuenta ) ;
////			System.out.println( "Nombre de cuenta: " + count.getNombre( ) ) ;
////			
//		}
//                
//                if( count.getStatus( ) != 1 )
//		{
//			throw new MasterCardException( 
//						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.NoCountTypeOnInitialize" ) , 
//						MCUtil.MASTERCARD_ERROR_CODE_COUNTTYPE_PACKAGEREQUEST_COUNTTYPE_NOT_EXITS , 
//						null ) ;
//		}
		
		// toma todos los tipocuentapaquete
		List< TblTipoCuentaPaquete > tipoCuentaPaquetes = countType.getTblTipoCuentaPaquetes( ) ;
		
		// Recorre los tipocuentapaquetes
		for( TblTipoCuentaPaquete tipoCuentaPaq : tipoCuentaPaquetes )
		{
			if ( tipoCuentaPaq.getStatus( ) == 0 )
                            continue ;
                        // verifica el paquete
			TblPaquete paq = tipoCuentaPaq.getTblPaquete( ) ;
			
			// en caso de que el paq sea status 0
			if( paq.getStatus( ) == 0 )
				continue ;
			
			// paquetesolicitar al que introducira el paquete
			PaqueteSolicitar paqSolInt = null ;
			
			// recorre los PaqeteSolicitar
			for( PaqueteSolicitar paqSol : paqueteSolicitarLista )
			{
				// para cada paquete verifica si es del mismo paqueteSolicitar
				// en caso d euqe sea del mismo
				if( paqSol.verifyPackage( tipoCuentaPaq ) )
				{
					// asitna paqueteSolicitar
					paqSolInt = paqSol ;
					
					// rompe ciclo
					break ;
				}
			}
			
			// en caso de que paqSolInt sea null
			if( paqSolInt == null )
			{
				paqSolInt = new PaqueteSolicitar( paq.getHabitacion( ) , paq.getTblAsset( ) , cveCuenta ) ;
				// agrega al arreglo
				paqueteSolicitarLista.add( paqSolInt ) ;
			}
			
			// agrega el tipoCuentaPaquete
			paqSolInt.addPackageCountType( tipoCuentaPaq ) ;
			
			// ya quedo por cada paqueteTipoCuenta.
		}// termina el ciclo for
		
	}// termina el metodo de inicializacion
}




